#-*- coding: utf-8 -*-
'''
author : Bruno Rendeiro 11236  \
			& André Simão 6039
date : 23 de outubro de 2012
obs : 2 parte
 nucleo da parte estatistica e do desenho de graficos
'''

import sqlite3

import matplotlib.pyplot as plt
from pylab import *

connection= sqlite3.connect('IPC_Portugal.db')
c= connection.cursor()


#ano  #row 0
#ipc global	#1
#taxa	#2
#minimo	#3
#maximo	#4
#PIB	#5
#rendimento nacional	#6
#rendimento disponivel	#7
#renumeraçao	#8
#evolucao renumeraçoes minimas	#9
#evolucao renumeraçoes maximas	#10


#buscar valor do sql e preenche as tabelas com esses valores da sql conforme o itnervalo de anos desejado
def preencher_listas(a,b,listaAno,listaIpc,listaTaxa,listaMinimo,listaMaximo,listaPib,listaNacional,listaDisponivel,listaRenumeracao,listaEvoMin,listaEvoMax):
	
	k=0
	lista1=[]
	lista2=[]
	lista3=[]
	lista4=[]
	lista5=[]
	lista6=[]
	lista7=[]
	lista8=[]
	lista9=[]
	lista10=[]
	lista11=[]

	for row in c.execute('SELECT * FROM dados WHERE ano >= ? ',(a,)):
		lista1.append(row[0])
		lista2.append(row[1])
		lista3.append(row[2])
		lista4.append(row[3])
		lista5.append(row[4])
		lista6.append(row[5])
		lista7.append(row[6])
		lista8.append(row[7])
		lista9.append(row[8])
		lista10.append(row[9])
		lista11.append(row[10])
	
	for i in range(0,len(lista1)):
		if lista1[i] == b:
			k=i
			
	for o in range(0,k+1):
		listaAno.append(lista1[o])
		listaIpc.append(lista2[o])
		listaTaxa.append(lista3[o])
		listaMinimo.append(lista4[o])
		listaMaximo.append(lista5[o])
		listaPib.append(lista6[o])
		listaNacional.append(lista7[o])
		listaDisponivel.append(lista8[o])
		listaRenumeracao.append(lista9[o])
		listaEvoMin.append(lista10[o])
		listaEvoMax.append(lista11[o])
		
	
	return(listaAno,listaIpc,listaTaxa,listaMinimo,listaMaximo,listaPib,listaNacional,listaDisponivel,listaRenumeracao,listaEvoMin,listaEvoMax)
	
	
#preenche valores em branco das listas por none
def preencher_nulos(listaAno,listaIpc,listaTaxa,listaMinimo,listaMaximo,listaPib,listaNacional,listaDisponivel,listaRenumeracao,listaEvoMin,listaEvoMax):		
	for i in range(0, (len(listaAno))):
		if 	listaIpc[i] =='' :
			listaIpc[i] = None
		if 	listaTaxa[i] =='' :
			listaTaxa[i] = None
		if 	listaMinimo[i] =='' :
			listaMinimo[i] = None		
		if 	listaMaximo[i] =='' :
			listaMaximo[i] = None
		if 	listaPib[i] =='' :
			listaPib[i] = None
		if 	listaNacional[i] =='' :
			listaNacional[i] = None
		if 	listaDisponivel[i] =='' :
			listaDisponivel[i] = None			
		if 	listaRenumeracao[i] =='' :
			listaRenumeracao[i] = None
		if 	listaEvoMin[i] =='' :
			listaEvoMin[i] = None
		if 	listaEvoMax[i] =='' :
			listaEvoMax[i] = None	
	return(listaAno,listaIpc,listaTaxa,listaMinimo,listaMaximo,listaPib,listaNacional,listaDisponivel,listaRenumeracao,listaEvoMin,listaEvoMax)
		
	
		
#desenha um grafico de recta
def graf_recta(valorX,valorY,titulo, labelxName,labelyName):
	plt.plot(valorX,valorY)
	plt.title(titulo)
	plt.xlabel(labelxName)
	plt.ylabel(labelyName)
	plt.grid()
	plt.show()
	
#desenha um grafico de barras
def graf_barra(valorX,valorY,titulo, labelxName,labelyName):
	
	pos = arange(len(valorX)) +.05
	bar(pos,valorY,align='center',color='#b8ff5c')
	xticks(pos,valorX)
	plt.title(titulo)
	plt.xlabel(labelxName)
	plt.ylabel(labelyName)	
	plt.grid()
	show()
	
#desenha um grafico de 2 rectas com legenda
def graf_recta2(valorX,valorY,valorZ,titulo, labelxName,labelyName,yName,zName):

	plt.plot(valorX,valorY,color="red",label=yName)
	plt.plot(valorX,valorZ,color="blue",label=zName)	
	plt.title(titulo)
	plt.xlabel(labelxName)
	plt.ylabel(labelyName)	
	plt.legend(loc="upper left")
	plt.grid()
	plt.show()	

#faz o calculo da media
def media(lista):
	soma=0
	a=0
	for i in range(0, (len(lista))):		
		if lista[i] != None:
			soma+=lista[i]
			a+=1
	return soma/a

#faz o calculo do desvioMedio
def desvioMedio(lista):
	mediaX=media(lista)
	k=0
	soma_desvio=0
	a=0
	for i in range(0, (len(lista))):		
		if lista[i] != None:
			if lista[i] < mediaX:
				a+=1
				k=mediaX - lista[i]
				soma_desvio+=k
					
			else:
				a+=1
				k= lista[i]-mediaX
				soma_desvio+=k
		

	desvioMedio= soma_desvio/ a
	return desvioMedio

#faz o calculo da variancia
def variancia(lista):
	'''
	variancia
	(soma quadratica - soma²/N) / N-1
	'''
	var=0.0
	soma_media=0.0
	soma_quad=0.0
	a=0
	for i in range(0, (len(lista))):		
		if lista[i] != None:
			a+=1
			soma_media+=lista[i]
			soma_quad+=lista[i] ** 2


	var+=((soma_quad -((soma_media ** 2)/a))/(a-1))
	return var

#faz o calculo do desvio Padrao
def desvioPadrao(lista):
	var=variancia(lista)
	return sqrt(var)
	
	
#calcula o coeficiente de variacao
def variacao(lista):
	a=media(lista)
	b=desvioPadrao(lista)
	return (b/a)*100
	
#imprime todos os valores estatisticos
def estatistica(lista):

	print "\nMedia: ",media(lista)
	print "\nVariancia: ", variancia(lista)
	print "\nDesvio Medio: ", desvioMedio(lista)
	print "\nDesvio Padrao: ", desvioPadrao(lista)
	print "\nCoeficiente de variacao: ",variacao(lista),"%"
	

